package com.infusionesuci2;

import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.infusionesuci.utils.Archivos;
import com.infusionesuci.utils.Geolocalizacion;
import com.infusionesuci.utils.GlobalConfiguration;
import com.infusionesuci.utils.WebService;
import com.infusionesuci2.R;
import com.google.analytics.tracking.android.EasyTracker;
import com.google.analytics.tracking.android.GoogleAnalytics;
import com.google.analytics.tracking.android.MapBuilder;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Typeface;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Spinner;
import android.widget.Toast;

public class ListaMedicamentos extends Activity implements OnItemClickListener {

	public ListView lstMedicamentos;
	public Medicamentos medicamentos;
	public ArrayList<Medicamento> listaCentral;
	private Archivos archivos = null;
	private InputStreamReader archivoEntrada;
	private OutputStreamWriter archivoSalida;

	// variables nuevas para las oportunidades de conocer la app
	private OutputStreamWriter archivoOportunidadesOut;
	private InputStreamReader archivoOportunidadesIn;
	private int oportunities;

	private String imei;
	// private String nombre;
	private String email;
	// private String numero;
	private String especialidad;
	private Button registrar;
	private Dialog dialog;
	private Spinner spinner;
	//private EditText tvnombre;
	private EditText tvemail;
	//private EditText txtnumero;
	private String info;
	private WebService ws;
	private Typeface fuenteTitulo;
	private Typeface fuenteContenido;
	private TextView tituloap;
	private EditText Edit;
	private Boolean hayInfusiones;
	private TextView terminos;
	private CheckBox chkTerminosCondiciones;

	// Geolocalizacion:
	private LocationManager locationManager;
	private String proveedor = "";
	private Geolocalizacion geo;
	private Double[] coordenadas;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista_medicamentos_nueva);
		// Analytics
		GoogleAnalytics.getInstance(this).getTracker("UA-45986553-3");
		// Geolocalizacion
		coordenadas = new Double[2];
		this.locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
		this.proveedor = LocationManager.NETWORK_PROVIDER;
		this.geo = new Geolocalizacion(locationManager);
		this.hayInfusiones = false;
		this.tituloap = (TextView) findViewById(R.id.tituloapp);
		this.Edit = (EditText) findViewById(R.id.search);
		this.lstMedicamentos = (ListView) findViewById(R.id.lst);
		this.ws = new WebService();
		this.archivos = new Archivos();
		this.fuenteTitulo = Typeface.createFromAsset(getAssets(),"Roboto-Regular.ttf");
		this.fuenteTitulo = Typeface.createFromAsset(getAssets(),"Roboto-Light.ttf");
		this.tituloap.setTypeface(this.fuenteTitulo);
		String infusiones = "";

		/**
		 * Metodo para cargar la informacion del usuario, si esta almacenada y
		 * no se ha enviado, se mira si hay internet y se envia, si ya se envio
		 * o no hay internet no se hace nada. Si no hay informacion se le pide
		 * al usuario un registro en el catch, y si hay internet se envia y si
		 * no se almacena.
		 */
		try {	
			try {
				this.archivoEntrada = new InputStreamReader(
						openFileInput("infusiones.txt"));
				infusiones = archivos.leer(archivoEntrada);
				if (infusiones != null && !infusiones.equals("")
						&& hayInternet()) {
					this.hayInfusiones = true;
				}
			} catch (FileNotFoundException e) {

			}
			this.archivoEntrada = new InputStreamReader(
					openFileInput("informacion.txt"));
			info = archivos.leer(archivoEntrada);
			String[] datos = info.split("#");
			if (datos[0].toUpperCase().equals("NO")) {
				if (hayInternet()) {
					if(datos.length==6){
						imei = datos[1];
						email = datos[3];
						especialidad = datos[5];
					}
					else if(datos.length==5){
						imei = datos[1];
						email = datos[3];
						especialidad = datos[4];
					}
					else{
						imei = datos[1];
						email = datos[2];
						especialidad = datos[3];
					}
					if (this.hayInfusiones) {
						new EnviarInformacion().execute("datosUsuario",
								"datosInfusiones", infusiones);
					} else {
						new EnviarInformacion().execute("datosUsuario", "");
					}
				}
			} else {
				if (hayInternet() && this.hayInfusiones) {
					new EnviarInformacion().execute("", "datosInfusiones",
							infusiones);
				}
			}
		} catch (FileNotFoundException e) {

			try {

				this.archivoOportunidadesIn = new InputStreamReader(
						openFileInput("oportunidades.txt"));

			} catch (FileNotFoundException e1) {

				try {
					archivoOportunidadesOut = new OutputStreamWriter(
							openFileOutput("oportunidades.txt",
									Activity.MODE_PRIVATE));
				} catch (Exception e2) {

				}
				archivos.guardar(archivoOportunidadesOut, "0");
				try {
					this.archivoOportunidadesIn = new InputStreamReader(
							openFileInput("oportunidades.txt"));
				} catch (Exception e2) {
				}
			}
			this.oportunities = Integer.parseInt(archivos
					.leer(this.archivoOportunidadesIn));
			if (this.oportunities > 2) {

				TelephonyManager mngr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);// se
																										// obtiene
																										// el
																										// imei
																										// del
																										// celular
				imei = mngr.getDeviceId();

				this.dialog = new Dialog(this);// Se crea el PopUp para
												// registro.
				this.dialog.setCancelable(false);
				this.dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
				this.dialog.setContentView(R.layout.registro);
				this.dialog.setTitle("Comentarios");

				// Se referencian los campos de la vista del registro:
				this.spinner = (Spinner) dialog.findViewById(R.id.spinner2);
				//this.tvnombre = (EditText) dialog.findViewById(R.id.nombre);
				this.tvemail = (EditText) dialog.findViewById(R.id.email);
				//this.txtnumero = (EditText) dialog.findViewById(R.id.numero);
				this.registrar = (Button) dialog
						.findViewById(R.id.btnregistrar);
				this.chkTerminosCondiciones = (CheckBox) dialog
						.findViewById(R.id.chkTerminos);

				this.terminos = (TextView) dialog
						.findViewById(R.id.lblTerminos);
				SpannableString spanString = new SpannableString(getResources()
						.getString(R.string.lblAcepto));
				spanString.setSpan(new UnderlineSpan(), 0, spanString.length(),
						0);
				this.terminos.setText(spanString);

				this.llenarSpiner();
				//this.tvnombre.setTypeface(this.fuenteTitulo);
				this.tvemail.setTypeface(this.fuenteTitulo);
				//this.txtnumero.setTypeface(this.fuenteTitulo);

				// Se detecta el evento del boton y se revisan campos
				this.registrar.setOnClickListener(new Button.OnClickListener() {
					public void onClick(View v) {
						// nombre = tvnombre.getText().toString();
						email = tvemail.getText().toString();
						// numero = txtnumero.getText().toString();
						especialidad = spinner.getSelectedItem().toString();
						if (imei == null || imei.equals("")) {
							// cambie el numero por un ramdom
							imei = "t-" + (1 + Math.random() * 100000000)+(1 + Math.random() * 100000000);
						}

						if (email.equals("")) {
							Toast.makeText(
									getApplicationContext(),
									getResources().getString(
											R.string.toastCamposIncompletos),
									Toast.LENGTH_LONG).show();
						} else if (!email
								.matches("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
										+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$")) {
							Toast.makeText(
									getApplicationContext(),
									getResources().getString(
											R.string.toastEmailErroneo),
									Toast.LENGTH_LONG).show();
						} else if (!chkTerminosCondiciones.isChecked()) {
							Toast.makeText(
									getApplicationContext(),
									getResources().getString(
											R.string.toastAceptarTerminos),
									Toast.LENGTH_LONG).show();
						} else {
							info = "no#" + imei + "#" + email + "#"
									+ especialidad;
							if (hayInternet()) {
								dialog.dismiss();
								new EnviarInformacion().execute("datosUsuario",
										"");
							} else {
								try {
									archivoSalida = new OutputStreamWriter(
											openFileOutput("informacion.txt",
													Activity.MODE_PRIVATE));
								} catch (FileNotFoundException e) {
								}
								archivos.guardar(archivoSalida, info);
								dialog.dismiss();
							}
						}
					}
				});

				this.terminos.setOnClickListener(new OnClickListener() {

					public void onClick(View v) {
						// TODO Auto-generated method stub
						Intent intent = new Intent(getApplicationContext(),
								Condiciones.class);
						startActivity(intent);
					}
				});
				dialog.show();
			} else {

				this.oportunities = this.oportunities + 1;

				try {
					this.archivoOportunidadesOut = new OutputStreamWriter(
							openFileOutput("oportunidades.txt",
									Activity.MODE_PRIVATE));
				} catch (Exception e2) {

				}
				archivos.guardar(archivoOportunidadesOut,
						String.valueOf(this.oportunities));
			}
		}

		// Fin información del usuario

		/**
		 * A continuacion se recuperan las infusiones que no se han podido
		 * enviar al servidor porque no hay iternet, se mira si ya hay conexion
		 * para enviarlas y se envian, de lo contrario se dejan almacenadas y no
		 * se hace nada. Si no hay infusiones almacenadas no se hace nada.
		 */
		/*
		 * try { this.archivoEntrada = new
		 * InputStreamReader(openFileInput("infusiones.txt")); String infusiones
		 * = archivos.leer(archivoEntrada); if (infusiones != null &&
		 * !infusiones.equals("") && hayInternet()) { new
		 * EnviarInfusiones().execute(infusiones); } } catch
		 * (FileNotFoundException e) {} //fin recuperacion y envio de infusiones
		 * almacenadas.
		 */

		/**
		 * Se obtienen los medicamentos almacenados en el archivo pruebas.txt
		 * que se encuentra en la carpeta raw para posteriormente mostrarlos en
		 * la list view
		 */
		InputStream txt = getResources().openRawResource(R.raw.medicamentos);
		this.medicamentos = new Medicamentos(txt);
		this.listaCentral = this.medicamentos.getMedicamentos();
		this.mostrar(listaCentral);
		this.lstMedicamentos.setOnItemClickListener(this);

		// Metodo para filtrar la lista segun lo que el usuario escriba.
		this.Edit.addTextChangedListener(new TextWatcher() {
			public void onTextChanged(CharSequence arg0, int arg1, int arg2,
					int arg3) {
				if (arg0 != null && !arg0.equals("")) {
					serch(arg0, medicamentos.getMedicamentos());
				}
			}

			public void beforeTextChanged(CharSequence arg0, int arg1,
					int arg2, int arg3) {
			}

			public void afterTextChanged(Editable arg0) {
			}
		});
	}

	/**
	 * Metodo que le ingresa las letras que va escribiendo el usuario y busca
	 * los medigcamentos asociados a las letras que valla tecleando y las
	 * renderisa en la listView respectiva.
	 */
	public void serch(CharSequence key, ArrayList<Medicamento> lstMedicamento) {
		ArrayList<Medicamento> listaMedicamentos = new ArrayList<Medicamento>();
		for (int i = 0; i < lstMedicamento.size(); i++) {
			if (lstMedicamento.get(i).getNombre().toUpperCase()
					.startsWith(String.valueOf(key).toUpperCase())) {
				listaMedicamentos.add(lstMedicamento.get(i));
			}
		}
		this.listaCentral = listaMedicamentos;
		this.mostrar(listaCentral);
	}

	// Muestra la interfaz con el manual de usuario:
	public void ayuda(View view) {
		// Analytics
		EasyTracker easyTracker = EasyTracker.getInstance(this);
		easyTracker.send(MapBuilder.createEvent("ui_action", // Event category
																// (required)
				"Ayuda_press", // Event action (required)
				"btn_Ayuda", // Event label
				null) // Event value
				.build());
		// ---------
		Intent intent = new Intent(this, Ayuda.class);
		startActivity(intent);
	}

	/**
	 * Metodo que muestra en el listView la lista que le ingresa
	 * 
	 * @param lstMedicamento
	 */
	public void mostrar(ArrayList<Medicamento> lstMedicamento) {
		Adaptador adaptador = new Adaptador(this, lstMedicamento);
		lstMedicamentos.setAdapter(adaptador);
	}

	/**
	 * Metodo que detecta si el usuario presiona algun elemento de la lista de
	 * medicamentos para pasar su información a la siguiente actividad.
	 */
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		// Analytics
		EasyTracker easyTracker = EasyTracker.getInstance(this);
		easyTracker.send(MapBuilder.createEvent("ui_action", // Event category
																// (required)
				"item_press", // Event action (required)
				listaCentral.get(arg2).getNombre(), // Event label
				null) // Event value
				.build());
		// ---------
		if (listaCentral.get(arg2).estaBloqueado()) {

			final TextView t_view = new TextView(getApplicationContext());
			t_view.setText(R.string.contenidoAlert);
			t_view.setTextSize(17);
			t_view.setPadding(30, 30, 30, 30);
			t_view.setTypeface(this.fuenteTitulo);

			new AlertDialog.Builder(this)
					.setIcon(R.drawable.logo)
					.setTitle(R.string.tituloAlert)
					.setView(t_view)
					// .setMessage(R.string.contenidoAlert)
					.setPositiveButton(R.string.Boton1Alert,
							new DialogInterface.OnClickListener() {

								@Override
								public void onClick(DialogInterface dialog,
										int which) {

									Intent intent = new Intent(
											Intent.ACTION_VIEW,
											Uri.parse("market://details?id=com.infusionesuci2Pro"));
									startActivity(intent);

								}

							}).setNegativeButton(R.string.Boton2Alert, null)
					.show();

		} else {
			GlobalConfiguration.getSingletonObject().setSelectedMedicamento(
					listaCentral.get(arg2));
			Intent intent = new Intent(this, ShowDetailMedicamentos.class);
			startActivity(intent);
		}
	}

	public void llenarSpiner() {// getResources().getString(R.string.accept);
		ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(this,
				R.array.especialidad, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		String[] ls = { getResources().getString(R.string.spnAnestesia),
				getResources().getString(R.string.spnCirugia),
				getResources().getString(R.string.spnCIntensivo),
				getResources().getString(R.string.spnEnfermeria),
				getResources().getString(R.string.spnGinecoobstetricia),
				getResources().getString(R.string.spnMedInterna),
				getResources().getString(R.string.spnOrtopedia),
				getResources().getString(R.string.spnUrgencias),
				getResources().getString(R.string.spnOtras) };
		this.spinner.setAdapter(new AdaptadorSpinner(this,
				R.layout.custom_spinner, ls));
	}

	private boolean hayInternet() {
		ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		if (cm.getActiveNetworkInfo() != null
				&& cm.getActiveNetworkInfo().isAvailable()
				&& cm.getActiveNetworkInfo().isConnected()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Hilo que se invoca cuando hay internet para enviar informacion del
	 * usuario.
	 * 
	 * @author sebastian
	 */
	private class EnviarInformacion extends AsyncTask<String, Void, Void> {

		private JSONObject json_data;
		private Boolean resultado;

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
		}

		@Override
		protected Void doInBackground(String... params) {
			if (params[0].equals("datosUsuario")) {
				coordenadas = geo.obtenerCoordenadas();
				String[] parametros = { "registroUsuarioFree", imei, "", email, "",
						especialidad, String.valueOf(coordenadas[0]),
						String.valueOf(coordenadas[1]) };

				JSONArray respuesta = ws.conectar(parametros);
				try {
					json_data = respuesta.getJSONObject(0);
					resultado = json_data.getBoolean("respuesta");
					if (resultado) {
						try {
							archivoSalida = new OutputStreamWriter(
									openFileOutput("informacion.txt",
											Activity.MODE_PRIVATE));
						} catch (FileNotFoundException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						info = info.substring(2, info.length());
						info = "si" + info;
						archivos.guardar(archivoSalida, info);
					} else {
						try {
							archivoSalida = new OutputStreamWriter(
									openFileOutput("informacion.txt",
											Activity.MODE_PRIVATE));
							archivos.guardar(archivoSalida, info);
						} catch (FileNotFoundException e) {

						}
					}
				} catch (JSONException e) {
					try {
						archivoSalida = new OutputStreamWriter(openFileOutput("informacion.txt", Activity.MODE_PRIVATE));
						archivos.guardar(archivoSalida, info);
					} catch (FileNotFoundException e2) {

					}
				}
			}
			if (params[1].equals("datosInfusiones")) {
				String[] param = {"registroInfusionOldFree",params[2]};
				JSONArray respuesta=ws.conectar(param);
				try {
					json_data=respuesta.getJSONObject(0);
					resultado=json_data.getBoolean("respuesta");
					if (resultado) {
						archivoSalida=new OutputStreamWriter(openFileOutput(
								"infusiones.txt", Activity.MODE_PRIVATE));
						archivos.guardar(archivoSalida, "");
					}
				} catch (JSONException e) {

				} catch (FileNotFoundException e) {

				}
			}
			return null;
		}

		@Override
		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
		}

	}

	@Override
	public void onStart() {
		super.onStart();
		EasyTracker.getInstance(this).activityStart(this);
		if (!proveedor.equals("")) {
			// Register the listener with the Location Manager to receive
			// location updates
			locationManager.requestLocationUpdates(
					LocationManager.NETWORK_PROVIDER, 0, 0, this.geo);
		}
	}

	@Override
	public void onStop() {
		super.onStop();
		EasyTracker.getInstance(this).activityStop(this);
		this.locationManager.removeUpdates(this.geo);
	}

	@Override
	public void onResume() {
		super.onResume();
		// Activamos notificaciones de localizaci�n
		if (!proveedor.equals("")) {
			// Register the listener with the Location Manager to receive
			// location updates
			locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this.geo);
		}
	}

	@Override
	public void onPause() {
		super.onPause();
		// Desactivamos notificaciones para ahorrar bater�a
		this.locationManager.removeUpdates(this.geo);
	}
}
